﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Grishko.SerilizeTools;
using Grishko.DataTier.SqlSentence;

namespace Grishko.DataTier.SqlScriptor
{
    /// <summary>
    /// Команда выборки    
    /// </summary>
    [IsNotSrchStorageLinksObject]
    public class SelectCommand:EntitySingle 
    {
        private Sentence.TWordList _params = new Sentence.TWordList();
        private  int startRecord            =0;
        private int endRecord               = 100;

        #region Public 
        /// <summary>
        /// Шаблон пространства поиска
        /// </summary>
        public virtual Type SearchAreaTemplateType { get; set; }

        /// <summary>
        /// Параметры выборки 
        /// </summary>        
        public Sentence.TWordList Params { get { return _params; } set { _params = value; } }

        /// <summary>
        /// команда строго параметризирована
        /// </summary>
        [EntityNonSerialized]
        public  bool ImStronglyParametrized
        {
            get { return !(Params.IHaveOnlyValueSrchItem || 0 == Params.Count); }
        }

        /// <summary>
        /// Вернуть набор (усл1 and усл2) or (усл3)
        /// </summary>
        /// <returns></returns>
        public  List<List<Word>> GetSetOfAndOrConditions()
        {
            bool flag = false;            
            List<List<Word>> result = new List<List<Word>>();
            List<Word> list = _params.GetSortedWords();
            
            if (0 == list.Count)
                        return result;
            // начинаем только с И
            if (list[0].WordType == Word.WordTypes.OR)
                        list[0].WordType = Word.WordTypes.AND;

            List<Word> CurentStepBox= null;
                                              
            // Каждая И - отдельная кучка 
            foreach (Word item in list)
            {
                
                // Уперлись в И - новая кучка 
                if (item.WordType == Word.WordTypes.AND)
                {
                    CurentStepBox = new List<Word>();
                    result.Add(CurentStepBox);

                }
                CurentStepBox.Add(item);
                
            }

            return result;

        }

        public int StartRecord { get { return startRecord; } set { startRecord = value; } }
        public int EndRecord { get { return endRecord ; } set { endRecord = value; } }
        #endregion

        public override void Load()
        {         
        }
    }
}
